/*
 * @Author: 杰编程 2306248989@qq.com
 * @Date: 2023-07-28 20:42:07
 * @LastEditors: 杰编程 2306248989@qq.com
 * @LastEditTime: 2023-07-28 22:31:58
 * @FilePath: /lesson21/2. cp/main.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include<iostream>
#include"blockQueue.hpp"
#include"task.hpp"
using namespace std;

#include<ctime>

#include<pthread.h>
#include<unistd.h>

std::string ops="+-*/";

void* consumerRountine(void* args)
{
    BlockQueue<Task>* bq=static_cast<BlockQueue<Task>*>(args);
    while(true)
    {
        //1. 从队列中拿取数据
        Task t;
        bq->pop(&t);
        //2. 处理数据，完成消费工作
        t();
        cout<<pthread_self()<<" | "<<t.formatArg()<<t.formatRes()<<endl;
    }
    return nullptr;
}
void* producerRountine(void* args)
{
    BlockQueue<Task>* bq=static_cast<BlockQueue<Task>*>(args);
    while(true)
    {
        //1. 生产数据
        int x=rand()%10;
        int y=rand()%10;
        char op=ops[rand()%ops.size()];
        Task t(x,y,op);
        //2. 将数据推送到blockqueue的结构中，完成生产工作
        bq->push(t);
        cout<<pthread_self()<<" | "<<t.formatArg()<<"?"<<endl;
    }
    return nullptr;
}

int main()
{
    srand((uint64_t)time(nullptr)^getpid());
    pthread_t c[3],p[2];
    BlockQueue<Task> bq;
    pthread_create(&c[0],nullptr,consumerRountine,&bq);
    pthread_create(&c[1],nullptr,consumerRountine,&bq);
    pthread_create(&c[2],nullptr,consumerRountine,&bq);
    pthread_create(&p[0],nullptr,producerRountine,&bq);
    pthread_create(&p[1],nullptr,producerRountine,&bq);

    pthread_join(c[0],nullptr);
    pthread_join(c[1],nullptr);
    pthread_join(c[2],nullptr);
    pthread_join(p[0],nullptr);
    pthread_join(p[1],nullptr);

    return 0;
}


// void* consumerRountine(void* args)
// {
//     BlockQueue<int>* bq=static_cast<BlockQueue<int>*>(args);
//     while(true)
//     {
//         //1. 从队列中拿取数据
//         int data=0;
//         bq->pop(&data);
//         //2. 处理数据，完成消费工作
//         cout<<pthread_self()<<"| consumerRountine done, "<<"data: "<<data<<endl;
//     }
//     return nullptr;
// }
// void* producerRountine(void* args)
// {
//     BlockQueue<int>* bq=static_cast<BlockQueue<int>*>(args);
//     while(true)
//     {
//         sleep(1);
//         //1. 生产数据
//         int data=rand()%10;
//         //2. 将数据推送到blockqueue的结构中，完成生产工作
//         bq->push(data);
//         cout<<pthread_self()<<"| push data,"<<"data:"<<data<<endl;
//     }
//     return nullptr;
// }

// int main()
// {
//     srand((uint64_t)time(nullptr)^getpid());
//     pthread_t c,p;
//     BlockQueue<int> bq;
//     pthread_create(&c,nullptr,consumerRountine,&bq);
//     pthread_create(&p,nullptr,producerRountine,&bq);

//     pthread_join(c,nullptr);
//     pthread_join(p,nullptr);

//     return 0;
// }
